DRY
- DRY (Don't Repeat Yourself) - Practice Exercises
- Exercise 1: Identify Duplication
- Exercise 2: Extract Method
- Exercise 3: Use Configuration
- Exercise 4: Generic Helper
- Exercise 5: Extension Methods
- Exercise 6: Avoid Premature Abstraction
- Exercise 7: Template Method Pattern
- Exercise 8: Strategy Pattern for Variants
- Exercise 9: Shared Validation Rules
- Exercise 10: Consistent Error Mapping
- Exercise 11: Use Common Result Types
- Exercise 12: Repository Base Class
- Exercise 13: Shared Test Data Builders
- Exercise 14: Mapping Profiles
- Exercise 15: Logging Helper
- Exercise 16: Avoid Copy-Paste Configuration
- Exercise 17: Shared Authorization Policies
- Exercise 18: Shared Retry Policies
- Exercise 19: Shared DTO Validation
- Exercise 20: Audit Trail Helpers
DRY (Don't Repeat Yourself) - Practice Exercises
Exercises focused on reducing duplication without over-abstracting.
---
Exercise 1: Identify Duplication
Q: Find duplicated logic in two pricing methods and propose a shared helper.
A: Extract the shared calculation into a single private method or domain service.
---
Exercise 2: Extract Method
Q: Refactor repeated validation checks into a single method.
A: Create ValidateOrder and reuse it across handlers.
---
Exercise 3: Use Configuration
Q: Replace repeated magic numbers with configuration.
A: Use IOptions<T> and pull limits from configuration.
---
Exercise 4: Generic Helper
Q: Create a generic method to add pagination to queries.
A: Use a reusable ApplyPaging extension on IQueryable<T>.
---
Exercise 5: Extension Methods
Q: Move repeated DTO mapping into extension methods.
A: Order.ToDto() encapsulates mapping in one place.
---
Exercise 6: Avoid Premature Abstraction
Q: When should you NOT extract shared code?
A: If two code paths are similar but likely to diverge, keep them separate.
---
Exercise 7: Template Method Pattern
Q: Apply a template method to share a workflow.
A: Extract common steps and allow overrides for specific steps.
---
Exercise 8: Strategy Pattern for Variants
Q: Replace duplicated if/else pricing logic with strategies.
A: Create IPricingStrategy implementations and select at runtime.
---
Exercise 9: Shared Validation Rules
Q: Reuse FluentValidation rules between DTOs.
A: Create a base validator or use Include to share rules.
---
Exercise 10: Consistent Error Mapping
Q: Centralize exception-to-error mapping.
A: Use middleware or a shared error mapper instead of repeated try/catch.
---
Exercise 11: Use Common Result Types
Q: Standardize API responses.
A: Use a Result<T> or ProblemDetails to avoid duplicated response shapes.
---
Exercise 12: Repository Base Class
Q: Share common repository CRUD operations.
A: Use a generic repository base, but keep domain-specific queries separate.
---
Exercise 13: Shared Test Data Builders
Q: Remove repeated setup in tests.
A: Use builders or fixtures for reusable test data.
---
Exercise 14: Mapping Profiles
Q: Centralize mapping rules.
A: AutoMapper profiles avoid duplicate mapping code in handlers.
---
Exercise 15: Logging Helper
Q: Standardize log messages for business events.
A: Create helper methods for consistent log templates.
---
Exercise 16: Avoid Copy-Paste Configuration
Q: Extract DI registration into extension methods.
A: Use AddApplicationServices and AddInfrastructureServices.
---
Exercise 17: Shared Authorization Policies
Q: Avoid repeated policy checks across controllers.
A: Define policies once and use [Authorize(Policy = "...")].
---
Exercise 18: Shared Retry Policies
Q: Reuse Polly policies across clients.
A: Register named policies and apply to multiple HttpClients.
---
Exercise 19: Shared DTO Validation
Q: Reuse validation rules across similar DTOs.
A: Use abstract validators and inherit from them.
---
Exercise 20: Audit Trail Helpers
Q: Avoid repeated audit field assignments.
A: Use a single method to set CreatedBy, UpdatedBy, UpdatedAt.